home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / ZAKO02.C < prev    next >
Text File  |  2000-03-25  |  5KB  |  200 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. */
  5. /* 地面を歩く */
  6. #include <xsp2lib.h>
  7. #include "../SPASSION.H"
  8. #include "../player.h"
  9. #include "../enemy.h"
  10. #include "../eshot.h"
  11. #include "../effect.h"
  12. #include "../priority.h"
  13. #include "../BG.H"
  14. #include "../sound.h"
  15. #include "../entry.h"
  16. #include "../SUB.H"
  17. #ifndef NULL
  18. #define NULL ((void *) 0)
  19. #endif
  20.  
  21. #define P_X    (*((short *) (&player[0].lx)))    /*lxの上位ワード*/
  22. #define P_Y    (*((short *) (&player[0].ly)))    /*lyの上位ワード*/
  23.  
  24. #define PALET_MAIN    0x0500
  25.  
  26. short enemy_explode( ENEMY *ene );
  27. static short MoveEnemyZako02(ENEMY *);
  28. /*static void TiniEnemyZako02(ENEMY *);*/
  29.  
  30. #define PT_ST    0x18
  31. #define PT_END    0x18+7
  32.  
  33. static HIT_XY4    hit_p[]={
  34.     -8,-2,8,8,
  35.     -8,-2,8,8,
  36.     -8,-2,8,8,
  37.     -8,-2,8,8,
  38.     -8,-2,8,8,
  39.     -8,-4,8,8,
  40.     -8,-7,8,8,
  41.     -8,-8,8,8
  42. };
  43. static HIT_XY4    hit_o[]={
  44.     -8,-2,8,8,
  45.     -8,-2,8,8,
  46.     -8,-2,8,8,
  47.     -8,-2,8,8,
  48.     -8,-2,8,8,
  49.     -8,-4,8,8,
  50.     -8,-7,8,8,
  51.     -8,-8,8,8
  52. };
  53. static HIT_XY4    hit_s[]={
  54.     -8,-2,8,8,
  55.     -8,-2,8,8,
  56.     -8,-2,8,8,
  57.     -8,-2,8,8,
  58.     -8,-2,8,8,
  59.     -8,-4,8,8,
  60.     -8,-7,8,8,
  61.     -8,-8,8,8
  62. };
  63.  
  64. void InitEnemyZako02Hit( void )
  65. {
  66.     short    i;
  67.     for(i=1;i<8;i++){
  68.         hit_p[i].x1-=PLAYER_HIT_X;hit_p[i].y1-=PLAYER_HIT_Y;
  69.         hit_p[i].x2+=PLAYER_HIT_X;hit_p[i].y2+=PLAYER_HIT_Y;
  70.         hit_o[i].x1-=OPTION_HIT_X;hit_o[i].y1-=OPTION_HIT_Y;
  71.         hit_o[i].x2+=OPTION_HIT_X;hit_o[i].y2+=OPTION_HIT_Y;
  72.     }
  73. }
  74.  
  75. void InitEnemyZako02(ENEMY *ene)
  76. {
  77.     ene->info         = PALET_MAIN | PRIORITY_ZAKO;
  78.     ene->vx             = 0-map_vx;
  79.     ene->vy             = 0;
  80.     ene->hit_p[0]     = &hit_p[0];ene->hit_p[1]=NULL;
  81.     ene->hit_o[0]     = &hit_o[0];ene->hit_o[1]=NULL;
  82.     ene->hit_s[0]     = &hit_s[0];ene->hit_s[1]=NULL;
  83.     ene->hp             = 1;
  84.     ene->no_dead     = 0;
  85.     ene->func_enemy_move = MoveEnemyZako02;
  86. /*    ene->func_enemy_tini = TiniEnemyZako02;*/
  87.  
  88. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  89. }
  90.  
  91.  
  92. static short MoveEnemyZako02( ENEMY *ene )
  93. {
  94.     short    anim_num=0;
  95.     unsigned char angle;
  96.  
  97.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  98.     ene->x = ((ene->lx += ene->vx) >> 16)-8;    /*-8は表示位置をずらすため*/
  99.     ene->y = ((ene->ly += ene->vy) >> 16)-8;
  100.  
  101.     switch (ene->state){
  102.     case 0:            /* 回転 */
  103.         anim_num=(ene->anim_count++)/4;
  104.         ene->pt = obj_zako+PT_ST+anim_num;
  105.         if( anim_num > 4 ){
  106.             if( player[0].lx > ene->lx )    /* プレイヤーの方にジャンプ */
  107.                 ene->vx= 1*65536-map_vx;
  108.             else
  109.                 ene->vx=-1*65536-map_vx;
  110.             ene->vy=-2*65536;
  111.             ene->state++;
  112.         }
  113.         break;
  114.     case 1:            /* ジャンプ中 */
  115.         ene->vy+=4096;
  116.         if( ene->vy > 2*65536 )
  117.             ene->vy = 2*65536;
  118.         else if( ene->vy > 0 && ene->vy <= 4096 ){
  119.             switch ( level ){
  120.             case NOMAL:
  121.                 MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  122.                 SetSE(SE_ESHOT_NOMAL);    /* 敵ショット音 */
  123.                 break;
  124.             case HARD:
  125.                 MakeEShot(ESHOT_NOMAL, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  126.                 MakeEShot(ESHOT_NOMAL, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
  127.                 MakeEShot(ESHOT_NOMAL, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
  128.                 SetSE(SE_ESHOT_NOMAL);    /* 敵ショット音 */
  129.                 break;
  130.             }
  131.         }
  132.         if( ene->pt < obj_zako+PT_END ){
  133.             anim_num=(ene->anim_count++)/4;
  134.             ene->pt = obj_zako+PT_ST+anim_num;
  135.         }else
  136.             anim_num=7;        /* パターンの最後 */
  137.         /* 背景BGとの当たり判定 */
  138.         /* 上にぶつかる */
  139.         if( (CheckBGHit(ene->x-16+ 0,ene->y-16+ 0)==GROUND_BG)            /*左上*/
  140.          && (CheckBGHit(ene->x-16+15,ene->y-16+ 0)==GROUND_BG) ){        /*右上*/
  141.             ene->ly=( ((ene->y-16)/8+1)*8+8+16 )*65536;
  142.             ene->vy=0;
  143.         }
  144.         /* 下にぶつかる */
  145.         if( (CheckBGHit(ene->x-16+ 0,ene->y-16+15)==GROUND_BG)            /*左下*/
  146.          && (CheckBGHit(ene->x-16+15,ene->y-16+15)==GROUND_BG) ){        /*右下*/
  147.             ene->ly=( ((ene->y-1)/8)*8-8+16 )*65536;
  148.             ene->vy=0;
  149.             ene->vx=0-map_vx;
  150.             ene->state=2;    /* 着地 */
  151.             ene->anim_count=0;
  152.         }
  153.         /* 左にぶつかる */
  154.         if( (CheckBGHit(ene->x-16+ 0,ene->y-16+ 0)==GROUND_BG)            /*左上*/
  155.          && (CheckBGHit(ene->x-16+ 0,ene->y-16+15)==GROUND_BG) ){        /*左下*/
  156.             ene->lx=( ((ene->x-16)/8+1)*8+8+16 )*65536;
  157.             ene->vx=0-map_vx;
  158.         }
  159.         /* 右にぶつかる */
  160.         if( (CheckBGHit(ene->x-16+15,ene->y-16+ 0)==GROUND_BG)            /*右上*/
  161.          && (CheckBGHit(ene->x-16+15,ene->y-16+15)==GROUND_BG) ){        /*右下*/
  162.             ene->lx=( ((ene->x-1)/8)*8-8+16 )*65536;
  163.             ene->vx=0-map_vx;
  164.         }
  165.         break;
  166.     case 2:            /* 着地 */
  167.         anim_num=(ene->anim_count++)/4;
  168.         ene->pt = obj_zako+PT_END-anim_num;
  169.         if( ene->pt < obj_zako+PT_ST ){
  170.             ene->pt = obj_zako+PT_ST;
  171.             ene->anim_count=0;
  172.             ene->state=0;
  173.         }
  174.     }
  175.  
  176.     /* 画面外に出たら消去 */
  177.     if( ENE_X < 0 + 16 - 8 || ENE_X > 255 + 24 || ENE_Y > 255 + 24 )
  178.         return (0);
  179.  
  180.     /* ダメージを受けた時の処理 */
  181.     if(ene->damage){
  182.         MakeEffect(EFFECT_EXPLMINI, 0, ene->x, ene->y);
  183.         SetSE(SE_EXPL_S);    /* 爆発音 */
  184.         ene->player->score += 1;
  185.         return (0);        /* 消去 */
  186.     }
  187.     ene->hit_p[0] = &hit_p[anim_num];
  188.     ene->hit_o[0] = &hit_o[anim_num];
  189.     ene->hit_s[0] = &hit_s[anim_num];
  190.     xsp_set_st(ene);
  191.  
  192.     return(1);
  193. }
  194.  
  195. /*
  196. static void TiniEnemyZako02(ENEMY * p)
  197. {
  198. }
  199. */
  200.